<!--  -->
<template>
  <div class="addspu-warp">
    <el-form ref="form" label-width="80px">
      <!-- SUP名称 -->
      <el-form-item label="SPU名称">
        <el-input v-model="spuInfo.spuName" style="width: 45%;" />
      </el-form-item>
      <!-- 品牌 -->
      <el-form-item label="品牌">
        <el-select v-model="spuInfo.tmId" placeholder="请选择品牌">
          <el-option
            v-for="(trademark, index) in trademarkList"
            :key="trademark.id"
            :label="trademark.tmName"
            :value="trademark.id"
          />
        </el-select>
      </el-form-item>
      <!-- SPU描述 -->
      <el-form-item label="SPU描述">
        <el-input v-model="spuInfo.description" type="textarea" style="width: 45%;" rows="4" />
      </el-form-item>
      <!-- 添加图片 -->
      <el-form-item label="添加图片">
        <el-upload
          action="dev-api/admin/product/fileUpload"
          list-type="picture-card"
          :on-preview="handlePictureCardPreview"
          :on-remove="handleRemove"
          :on-success="handleSuccess"
          :file-list="spuImgList_1"
          :on-error="handleError"
        >
          <i class="el-icon-plus" />
        </el-upload>
        <el-dialog width="35%" :visible.sync="dialogVisible">
          <img width="50%" :src="dialogImageUrl" alt="" style="object-fit:scale-down;">
        </el-dialog>
      </el-form-item>
      <!-- 销售属性 -->
      <el-form-item label="销售属性">
        <el-select v-model="selectValue" :placeholder="`还有${saleAttrCount.length}种销售属性可选择`">
          <el-option
            v-for="(saleAttr, index) in saleAttrCount"
            :key="saleAttr.id"
            :label="saleAttr.name"
            :value="{id: saleAttr.id, name: saleAttr.name}"
          />
        </el-select>
        <el-button type="primary" icon="el-icon-plus" style="margin-left: 5px;" :disabled="!selectValue" @click="addSelect">添加销售属性</el-button>
        <!-- 销售表格 -->
        <template>
          <el-table :data="spuInfo.spuSaleAttrList" border style="width: 100%">
            <el-table-column label="序号" width="100" type="index" />
            <el-table-column prop="saleAttrName" label="属性名" width="200" />
            <el-table-column label="属性值名称列表">
              <template slot-scope="scope">
                <el-tag
                  v-for="tag in scope.row.spuSaleAttrValueList"
                  :key="tag.id"
                  closable
                  :disable-transitions="false"
                  @close="handleClose(scope.row.spuSaleAttrValueList,tag)"
                >
                  {{ tag.saleAttrValueName }}
                </el-tag>
                <el-input
                  v-if="scope.row.inputVisible"
                  ref="saveTagInput"
                  v-model="scope.row.inputValue"
                  class="input-new-tag"
                  size="small"
                  @keyup.enter.native="handleInputConfirm(scope.row)"
                  @blur="handleInputConfirm(scope.row)"
                />
                <el-button v-else class="button-new-tag" size="small" @click="showInput(scope.row)">添加</el-button>
              </template>
            </el-table-column>
            <el-table-column label="操作" width="180px">
              <template slot-scope="scope">
                <el-button size="mini" @click="deleSale(scope.$index)">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
        </template>
      </el-form-item>
      <!-- 操作按钮 -->
      <el-form-item>
        <el-button type="primary" @click="submitSpuInfo">提交</el-button>
        <el-button @click="saveSpu(0)">返回</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
// 这里可以导入其他文件（比如：组件，工具js，第三方插件js，json文件，图片文件等等）
// 例如：import 《组件名称》 from '《组件路径》';

export default {
  name: 'AddSpu',
  // import引入的组件需要注入到对象中才能使用
  components: {},
  data() {
    // 这里存放数据
    return {
      // spu数据
      spuInfo: {
        // 三级分类id
        category3Id: '',
        // 描述种类(spu描述)
        description: '',
        // spu名称
        spuName: '',
        // 品牌id
        tmId: '',
        // spu图片列表
        spuImageList: [],
        // 销售属性列表
        spuSaleAttrList: []
      },

      // 查看大图时的路径
      dialogImageUrl: '',
      // 点击大图时的弹窗的显示与隐藏
      dialogVisible: false,
      // 品牌信息列表
      trademarkList: [],
      // 销售属性列表
      saleAttrList: [],
      // 多张图片的列表进行一开始时展示使用
      spuImgList_1: [],
      // 保存图片数据
      spuImgList: [],
      // 销售属性值列表标签页添加输入框显示与隐藏
      // inputVisible: false,
      // 销售属性值列表标签页添加输入框的值
      // inputValue: '',
      // 销售属性值列表选择添加的属性保存的值
      selectValue: null
    }
  },
  // 监听属性 类似于data概念
  computed: {
    // 当两个数组存在相互影响时,可以使用此方法
    // 剩余销售属性值数组
    saleAttrCount() {
      // 第一步先遍历拿到数组中的元素
      return this.saleAttrList.filter(item_1 => {
        // 第二步 通过遍历来判断那些数据符合过滤条件
        return this.spuInfo.spuSaleAttrList.every(item => {
          // 第三步过滤条件为：当前遍历的元素的name在spuSaleAttrList中的name是否存在
          return item.saleAttrName !== item_1.name
        })
      })
    }
  },
  // 监控data中的数据变化
  watch: {},
  // 生命周期 - 创建完成（可以访问当前this实例）
  created() {
  },
  // 生命周期 - 挂载完成（可以访问DOM元素）
  mounted() {
  },
  beforeCreate() { }, // 生命周期 - 创建之前
  beforeMount() { }, // 生命周期 - 挂载之前
  beforeUpdate() { }, // 生命周期 - 更新之前
  updated() { }, // 生命周期 - 更新之后
  beforeDestroy() { }, // 生命周期 - 销毁之前
  destroyed() { }, // 生命周期 - 销毁完成
  activated() { },
  // 方法集合
  methods: {
    // 文件列表移除文件时的钩子
    handleRemove(file, fileList) {
      // console.log(file, fileList)
      // 移出列表中的文件时，将文件的路径移除
      // 1.获取删除图片在列表中的索引
      const index = this.spuImgList.indexOf(file)
      // 2.通过索引移除文件
      this.spuImgList.splice(index, 1)
    },
    // 文件上传成功时的钩子
    handleSuccess(file, fileList) {
      /*
            "spuImageList": [     //spu图片列表
    {
      "id": 0,              //当张图片id
      "imgName": "string",  //图片名称
      "imgUrl": "string",   //图片地址
      "spuId": 0            //spu id
    }
      */
      const spuImg_1 = {
        imgName: fileList.name,
        imgUrl: file.data
        // spuId: this.spuInfo.id
      }
      // const spuImg_2 = {
      //   url: file.data,
      //   name: fileList.name
      // }
      // this.spuImgList.push(spuImg_2)
      this.spuImgList.push(spuImg_1)
    },
    // 文件上传失败时的钩子
    handleError(file, fileList) {
      console.log(file, fileList)
    },
    // 文件上传时的默认函数
    uploadFile() {
      // console.log(1)
      // 暂时不做任何操作 不清楚原来先不处理
    },
    // 点击查看大图时的钩子
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url
      this.dialogVisible = true
    },
    // 获取品牌列表
    async getTrademarkList() {
      try {
        const result = await this.$API.spu.reqTrademarkList()
        this.trademarkList = result.data
      } catch (error) {
        return Promise.reject(error)
      }
    },
    // 获取销售属性列表
    async getSaleAttrList() {
      try {
        const result = await this.$API.spu.reqSaleAttrList()
        this.saleAttrList = result.data
      } catch (error) {
        return Promise.reject(error)
      }
    },
    // 获取SPU图片列表
    async getSpuImgList(spuid) {
      try {
        const result = await this.$API.spu.reqSpuImageList(spuid)
        this.spuImgList = result.data
        // 因为多图片展示需要在数据中加入url和name这两个属性
        // 因为spuImgList是一个数组，所以需要遍历
        result.data.forEach(item => {
          const spuImg = {
            url: item.imgUrl,
            name: item.imgName
          }
          this.spuImgList_1.push(spuImg)
        })
      } catch (error) {
        return Promise.reject(error)
      }
    },
    // 获取单独spu信息
    async getSpuInfo(spuid) {
      try {
        const result = await this.$API.spu.reqSpuById(spuid)
        this.spuInfo = result.data
        // console.log(result.data)
      } catch (error) {
        return Promise.reject(error)
      }
    },
    // 点击添加属性属性按钮的回调函数
    addSelect() {
      // 实现将销售属性添加到销售属性列表中
      const saleAttr = {
        baseSaleAttrId: this.selectValue.id,
        saleAttrName: this.selectValue.name,
        // spuId: this.spuInfo.id,
        spuSaleAttrValueList: []
      }
      this.spuInfo.spuSaleAttrList.push(saleAttr)
      this.selectValue = null
    },
    // 销售属性标签页的回调
    // 点击标签页x时的钩子
    handleClose(list, tag) {
      list.splice(list.indexOf(tag), 1)
    },
    // 点击销售属性列表中添加按钮回调
    showInput(row) {
      // 点击销售属性值当中添加按钮的时候，需要有button变为input,通过当前销售属性的inputvisible控制
      // 挂载在销售属性身上的响应式数据inputvisible,控制button与input切换
      this.$set(row, 'inputVisible', true)
      // 通过响应式数据inputvalue字段收集新增的销售属性值
      this.$set(row, 'inputValue', '')
      this.$nextTick(_ => {
        this.$refs.saveTagInput.$refs.input.focus()
      })
    },
    // 点击输入框的回调(保存数据到销售属性值列表)
    handleInputConfirm(row) {
      const inputValue = row.inputValue
      if (inputValue) {
        const obj = {
          baseSaleAttrId: row.baseSaleAttrId,
          // id: 51,
          isChecked: null,
          saleAttrName: row.saleAttrName,
          saleAttrValueName: inputValue
          // spuId: row.spuId
        }
        row.spuSaleAttrValueList.push(obj)
      }
      delete row.inputValue
      delete row.inputVisible
      // row.inputVisible = false
      // row.inputValue = ''
    },
    // 点击操作删除按钮的回调
    deleSale(index) {
      // 删除销售属性值列表中的数据
      this.spuInfo.spuSaleAttrList.splice(index, 1)
    },
    // 点击下方返回SPU信息展示模块
    saveSpu(tag) {
      // 将图片展示列表清空
      this.spuImgList_1 = []
      this.spuImgList = []
      // 绑定自定义事件，触发父组件的事件
      this.$emit('saveSpu', tag)
    },
    // 点击提交按钮的回调
    async submitSpuInfo() {
      // 整理数据 将图片的数据同步到spuInfo中
      this.spuInfo.spuImageList = this.spuImgList
      try {
        const result = await this.$API.spu.reqAddorUpdateSpu(this.spuInfo)
        if (result.code === 200) {
          this.$message.success('添加成功')
          // 清空数据
          // 调用返回的方法
          this.saveSpu(1)
          // this.$router.push('/goods/spu')
        }
      } catch (error) {
        this.$message.error('添加失败')
        // console.log(error)
      }
    }
  }
}
</script>
<style lang='scss' scoped>
.el-tag + .el-tag {
    margin-left: 10px;
  }
  .button-new-tag {
    margin-left: 10px;
    height: 32px;
    line-height: 30px;
    padding-top: 0;
    padding-bottom: 0;
  }
  .input-new-tag {
    width: 90px;
    margin-left: 10px;
    vertical-align: bottom;
  }
</style>
